﻿using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SuperSocket.WebSocket.Server;
using TouchSocket.Core;
using TouchSocket.Http.WebSockets;
using TouchSocket.Http;
using TouchSocket.Sockets;
using WebSocketServer.WebSocketService;

var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<WebSocketServerService>();
    })
    .Build();

await host.RunAsync();

#region 代码
//var service = await CreateHttpService();
//using (var client = await GetClient())
//{
//    while (true)
//    {
//        await client.SendAsync(Console.ReadLine());
//    }
//}

///// <summary>
///// 通过/ws直接连接
///// </summary>
//static async Task<WebSocketClient> GetClient()
//{
//    var client = new WebSocketClient();
//    await client.SetupAsync(new TouchSocketConfig()
//         .ConfigureContainer(a =>
//         {
//             a.AddConsoleLogger();
//         })
//         .SetRemoteIPHost("ws://127.0.0.1:8081/ws"));
//    await client.ConnectAsync();

//    client.Logger.Info("通过ws://127.0.0.1:8081/ws连接成功");
//    return client;
//}

//static async Task<HttpService> CreateHttpService()
//{
//    var service = new HttpService();
//    await service.SetupAsync(new TouchSocketConfig()//加载配置
//         .SetListenIPHosts(8081)
//         .ConfigureContainer(a =>
//         {
//             a.AddConsoleLogger();
//         })
//         .ConfigurePlugins(a =>
//         {
//             a.UseWebSocket()//添加WebSocket功能
//               .SetWSUrl("/ws")//设置url直接可以连接。
//               .UseAutoPong();//当收到ping报文时自动回应pong

//             a.Add<MyWebSocketPlugin>();
//         }));
//    await service.StartAsync();

//    service.Logger.Info("服务器已启动");
//    service.Logger.Info("直接连接地址=>ws://127.0.0.1:8081/ws");
//    return service;
//}


//public class MyWebSocketPlugin : PluginBase, IWebSocketReceivedPlugin
//{
//    private readonly ILog m_logger;

//    public MyWebSocketPlugin(ILog logger)
//    {
//        this.m_logger = logger;
//    }
//    public async Task OnWebSocketReceived(IWebSocket client, WSDataFrameEventArgs e)
//    {
//        switch (e.DataFrame.Opcode)
//        {
//            case WSDataType.Cont:
//                m_logger.Info($"收到中间数据，长度为：{e.DataFrame.PayloadLength}");

//                return;

//            case WSDataType.Text:
//                m_logger.Info(e.DataFrame.ToText());

//                if (!client.Client.IsClient)
//                {
//                    client.SendAsync("我已收到");
//                }
//                return;

//            case WSDataType.Binary:
//                if (e.DataFrame.FIN)
//                {
//                    m_logger.Info($"收到二进制数据，长度为：{e.DataFrame.PayloadLength}");
//                }
//                else
//                {
//                    m_logger.Info($"收到未结束的二进制数据，长度为：{e.DataFrame.PayloadLength}");
//                }
//                return;

//            case WSDataType.Close:
//                {
//                    m_logger.Info("远程请求断开");
//                    client.Close("断开");
//                }
//                return;

//            case WSDataType.Ping:
//                break;

//            case WSDataType.Pong:
//                break;

//            default:
//                break;
//        }

//        await e.InvokeNext();
//    }
//}



//internal class MyReadWebSocketPlugin : PluginBase, IWebSocketHandshakedPlugin
//{
//    private readonly ILog m_logger;

//    public MyReadWebSocketPlugin(ILog logger)
//    {
//        this.m_logger = logger;
//    }

//    public async Task OnWebSocketHandshaked(IWebSocket client, HttpContextEventArgs e)
//    {
//        //当WebSocket想要使用ReadAsync时，需要设置此值为true
//        client.AllowAsyncRead = true;

//        //此处即表明websocket已连接

//        while (true)
//        {
//            using (var receiveResult = await client.ReadAsync(CancellationToken.None))
//            {
//                if (receiveResult.DataFrame == null)
//                {
//                    break;
//                }

//                //判断是否为最后数据
//                //例如发送方发送了一个10Mb的数据，接收时可能会多次接收，所以需要此属性判断。
//                if (receiveResult.DataFrame.FIN)
//                {
//                    if (receiveResult.DataFrame.IsText)
//                    {
//                        this.m_logger.Info($"WebSocket文本：{receiveResult.DataFrame.ToText()}");
//                    }
//                }
//            }
//        }

//        //此处即表明websocket已断开连接
//        this.m_logger.Info("WebSocket断开连接");
//        await e.InvokeNext();
//    }
//}
#endregion